package Model;

import Enum.StatusBloqueio;
import Enum.TipoBloqueio;
import Enum.TipoOperacao;

public class Bloqueio {
	public Bloqueio(int idTransacao, TipoOperacao tipoOperacao, Objeto objeto, StatusBloqueio status) {
		this.idTransacao = idTransacao;
		this.objeto = objeto;
		this.tipoBloqueio = gerarTipoBloqueio(tipoOperacao);
		this.status = status;
	}

	public Bloqueio(int tid, TipoOperacao tipo, StatusBloqueio status) {
		this.idTransacao = tid;
		this.tipoBloqueio = gerarTipoBloqueio(tipo);
		this.status = status;
	}

	private TipoBloqueio gerarTipoBloqueio(TipoOperacao tipoOperacao) {
		switch (tipoOperacao) {
		case ESCRITA:
		case BLOQUEIO_ESCRITA:
			return TipoBloqueio.WRITE_LOCK;
		case LEITURA:
		case BLOQUEIO_LEITURA:
			return TipoBloqueio.READ_LOCK;
		case COMMIT:
			return TipoBloqueio.CERTIFIED_LOCK;
		default:
			return null;
		}
	}

	private Objeto objeto;
	StatusBloqueio status;

	private TipoBloqueio tipoBloqueio;

	private int idTransacao;

	public Objeto getObjeto() {
		return objeto;
	}

	public StatusBloqueio getStatus() {
		return status;
	}

	public TipoBloqueio getTipoBloqueio() {
		return tipoBloqueio;
	}

	public int getTid() {
		return idTransacao;
	}

	public void setObjeto(Objeto objeto) {
		this.objeto = objeto;
	}

	public void setStatus(StatusBloqueio status) {
		this.status = status;
	}

	public void setTipoBloqueio(TipoBloqueio tipoBloqueio) {
		this.tipoBloqueio = tipoBloqueio;
	}

	public void setTid(int uid) {
		this.idTransacao = uid;
	}

	@Override
	public String toString() {
		StringBuilder s = new StringBuilder();
		s.append("T");
		s.append(idTransacao);
		s.append(" ");

		switch (tipoBloqueio) {
		case READ_LOCK:
			s.append("RL");
			break;
		case WRITE_LOCK:
			s.append("WL");
			break;
		case CERTIFIED_LOCK:
			s.append("CL");
			s.append(" ");
			s.append(status);
			return s.toString();
		case INTENCIONAL_ESCRITA:
			s.append("IWL");
			break;
		case INTENCIONAL_LEITURA:
			s.append("IRL");
			break;
		default:
			break;
		}

		s.append("(");
		s.append(objeto);
		s.append(")");

		s.append(" ");
		s.append(status);
		return s.toString();
	}
}
